<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
class MakeModel extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('makeModel')
        ->addArgument('name', Argument::OPTIONAL, "添加参数")
            ->setDescription('默认是生成全部，all是强制覆盖，clear清除不存在的模型');
    }

    protected function execute(Input $input, Output $output)
    {
        $can = $input->getArgument('name');
		$config = config('database.connections.mysql');
		$prefix=$config['prefix'];
		$prefix_num=strlen($prefix);
        $mode_file=realpath(root_path().'app/model');
        $mian_file=realpath(root_path().'tpl/makeModel/index.php');
		$res=Db::query("SHOW TABLES");
        if($can=='all'){$iscan=true;}else{$iscan=false;}
        if($iscan){
            $this->delFile($mode_file);
        }
        $tabs=[];
		foreach ($res as $v){
			$aaa=array_values($v);
			if($prefix_num){
				$name=\substr($aaa[0],$prefix_num);
			}else{
				$name=$aaa[0];
			}
			$name=$this->convertUnderline3($name);
            $tabs[]=$name;
            
			$res=$this->makeFile($name,$can,$mode_file,$mian_file);
            if($res){
                $output->writeln($res);
            }
		}
        if($can=='clear'){$isclear=true;}else{$isclear=false;}
        if($isclear){
            $this->clearName($tabs,$mode_file,$output);
        }
        $output->writeln('生成文件成功！如果要强制更新需要添加参数 all,清除文件用clear');
  
    }
//删除数据表不存在的文件
    protected function clearName($tabs=[],$mode_file='',$output=''){
        $list = scandir($mode_file);
        $list=array_filter($list,function ($item){
            return $item != '.' and $item != '..';
        });
        $list=array_map(function ($item){
            return substr($item,0,strlen($item)-4);
        },$list);
        $res=array_diff($list,$tabs);
        foreach ($res as $v){
            if (file_exists($mode_file.DIRECTORY_SEPARATOR.$v.'.php')) {
                @unlink($mode_file.DIRECTORY_SEPARATOR.$v.'.php');
                $output->writeln('删除文件'.$v.'成功!');
            }
        }
    }
	//将下划线命名转换为驼峰式命名
	protected function convertUnderline3 ( $str , $ucfirst = true)
	{
		$str = ucwords(str_replace('_', ' ', $str));
		$str = str_replace(' ','',lcfirst($str));
		 return $ucfirst ? ucfirst($str) : $str;
	}
    //生成文件
    protected function makeFile ( $name='' , $can = '',$mode_file='',$mian_file='')
    {
        if(!$name or !$mode_file or !$mian_file){ return '找不到表名！';}
        if($can=='all'){$iscan=true;}else{$iscan=false;}

        //使用 file_exists("d:/mydir") 或 is_dir("d:/mydir")判断该文件夹是否存在
        if (!file_exists($mode_file)) {
            if (!mkdir($mode_file, 0777, true)) {
                return "创建文件夹失败";
            }
        }
        $file=$mode_file.'/'.$name.'.php';
        if(file_exists($file)){
            if($iscan){
                $edit=file_get_contents($mian_file);
                $edit=preg_replace('/{{name}}/',$name,$edit);
                file_put_contents($file,$edit);
                return "生成".$name."，model 文件成功";
            }
            return "";
        }else{
            $edit=file_get_contents($mian_file);
            $edit=preg_replace('/{{name}}/',$name,$edit);
            file_put_contents($file,$edit);
            return "生成".$name."，model 文件成功";
        }
    }
    //删除文件夹内容
    private function delFile($path)
    {
        if(file_exists($path)){
            //扫描一个文件夹内的所有文件夹和文件并返回数组
            $p = scandir($path);
            foreach($p as $val){
                //排除目录中的.和..
                if($val !="." && $val !=".."){
                    //如果是文件直接删除
                    unlink($path.DIRECTORY_SEPARATOR.$val);
                }
            }
        }
    }
}
